/**
  **********************************************************************************************************************
  * @file    cot_os.h
  * @brief   该文件提供查询协作式多任务系统功能函数原型
  * @author  const_zpc    any question please send mail to const_zpc@163.com
  * @date    2023-06-21
  **********************************************************************************************************************
  *
  **********************************************************************************************************************
  */

/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
#ifndef _COT_OS_H_
#define _COT_OS_H_

/* Includes ----------------------------------------------------------------------------------------------------------*/
#include <stdint.h>
#include <stddef.h>
#include <setjmp.h>

// 定义一个OS预编译宏
#define _COT_OS_

/* Exported types ----------------------------------------------------------------------------------------------------*/

typedef void (*OsTask_cb)(void);
typedef uint32_t (*GetSysTime_cb)(void);
typedef size_t (*GetStackSP_cb)(void);
typedef void (*SetStackSP_cb)(size_t);

/* Exported constants ------------------------------------------------------------------------------------------------*/
/* Exported macro ----------------------------------------------------------------------------------------------------*/

/**
  * @brief      当条件不成立时让出给其他协程任务执行
  * 
  * @attention  条件成立时不一定会立即运行, 具体要看其他协程任务什么时候让出资源
  * @param      cond 条件表达式
  */
#define cotOs_WaitFor_Cond(cond)   do{\
        extern jmp_buf *cotOs_GetTaskEnv1(void);\
        setjmp((*cotOs_GetTaskEnv1()));\
        if (!(cond)){\
            extern void cotOs_RunNextTask(void);\
            cotOs_RunNextTask();\
        }\
    }while (0)



/* Exported functions ------------------------------------------------------------------------------------------------*/

extern void cotOs_Init(size_t stack, GetSysTime_cb pfnOsTimer);
extern int cotOs_Creat(OsTask_cb pfnOsTaskEnter, size_t stack);
extern int cotOs_Start(void);
extern void cotOs_WaitFor(uint32_t time);

#endif // !_COT_TASK_H_
